// groupnpc.txt
// Exactly like basicnpc, with one difference. When it first spots a foe, sends
// an alert message to everyone in its group. Good for when you have a band of 
// monsters you don't want the party to be able to pick off one at a time.
// Memory Cells:
//   Cell 0 - How creature moves.
//     0 - If 0, wander randomly. 
//     1 - Stands still until a target appears.
//     2 - Completely immobile, even if target appears.
//   Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this 
//     is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when
//     creature is killed, sets SDF(3,5) to 1.)
//   Cell 3 - Dialogue node to start with if talked to. if left at 0, this
//     character doesn't talk.
//   Cell 4 - Group creature is in.  (You don't need to set this, but it
//     makes life a bit easier.  Leave it at 0 to do nothing.)
//   Cell 5,6 - SDF to increment.
//   Cell 7 - Amount to increment by.

begincreaturescript;

variables;

short i,target;
short i_gave_alert = 0;
short last_abil_time,which_atk,trgt,firedmg,mctx,mcty,rctx,rcty,fallout;
short count,avatar,beta_ok,ttcx,ttcy
short bmessage;

body;

beginstate INIT_STATE;
	if (get_memory_cell(0) == 2)
		set_mobility(ME,0);
	if (get_memory_cell(4) > 0)
		add_char_to_group(my_number(),get_memory_cell(4));
	break;

beginstate DEAD_STATE;

	reset_dialog();
	add_dialog_str(0,"Profanus Pyre has come pretty close to having enough.  He's beginning to wear down.",0);
	add_dialog_str(1,"_YOU...  HOW DARE YOU!  I WILL NOT BE DEFEATED!  I WILL NOT LOSE, NO MATTER WHAT!_",0);
	add_dialog_str(2,"He begins to hold his sword with a twitching hand, and the air in the room begins to smell like blood.",0);
	add_dialog_choice(0,"Give it up, already!");
	bmessage = run_dialog(1);

	set_character_pose(40,1);
	trgt = 6;
	avatar = 1;
	while(trgt <= 119){
		if(char_ok(trgt) == TRUE){
			if((((creature_type(trgt) == 6) || (creature_type(trgt) == 132)) || (creature_type(trgt) == 184)) || (((creature_type(trgt) == 113) || (creature_type(trgt) == 114)) || (creature_type(trgt) == 115))){
				erase_char(trgt);
				avatar = (avatar + 1);
			}
			if(trgt != 40)
				erase_char(trgt);
		}

		trgt = (trgt + 1);
	}
	print_str_color("Profanus Pyre uses Beta Hit!",1);
	pause(3);

	while(avatar > 0){
		trgt = 4;
		while(char_ok(trgt) == FALSE){
			trgt = random_party_member();
		}

		ttcx = char_loc_x(trgt);
		ttcy = char_loc_y(trgt);
		beta_ok = 0;
		// Y - 1
		if(beta_ok == 0){
			beta_ok = 1;
			if((beta_ok == 1) && (ttcy <= 3))
				beta_ok = 0;
			if((beta_ok == 1) && (get_terrain(ttcx,(ttcy - 1)) == 286))
				beta_ok = 0;
			if((beta_ok == 1) && (get_terrain(ttcx,(ttcy - 1)) == 378))
				beta_ok = 0;
		}
		// Y + 1
		if(beta_ok == 0){
			beta_ok = 2;
			if((beta_ok == 2) && (ttcy >= 19))
				beta_ok = 0;
			if((beta_ok == 2) && (get_terrain(ttcx,(ttcy + 1)) == 286))
				beta_ok = 0;
			if((beta_ok == 2) && (get_terrain(ttcx,(ttcy + 1)) == 378))
				beta_ok = 0;
		}
		// X - 1
		if(beta_ok == 0){
			beta_ok = 3;
			if((beta_ok == 3) && (ttcx <= 18))
				beta_ok = 0;
			if((beta_ok == 3) && (get_terrain((ttcx - 1),ttcy) == 286))
				beta_ok = 0;
			if((beta_ok == 3) && (get_terrain((ttcx - 1),ttcy) == 378))
				beta_ok = 0;
		}
		// X + 1
		if(beta_ok == 0){
			beta_ok = 4;
			if((beta_ok == 4) && (ttcx >= 46))
				beta_ok = 0;
			if((beta_ok == 4) && (get_terrain((ttcx + 1),ttcy) == 286))
				beta_ok = 0;
			if((beta_ok == 4) && (get_terrain((ttcx + 1),ttcy) == 378))
				beta_ok = 0;
		}
		rctx = char_loc_x(my_number());
		rcty = char_loc_y(my_number());
		if((beta_ok == 1) && ((rctx != ttcx) || (rcty != (ttcy - 1)))){
			put_boom_on_space(rctx,rcty,0,0);
			put_boom_on_space(ttcx,(ttcy - 1),0,0);
			relocate_character(my_number(),ttcx,(ttcy - 1));
			set_character_facing(my_number(),4);
			force_view_center(ttcx,ttcy);
			force_instant_terrain_redraw();
			run_animation_sound(10);
		}
		if((beta_ok == 2) && ((rctx != ttcx) || (rcty != (ttcy - 1)))){
			put_boom_on_space(rctx,rcty,0,0);
			put_boom_on_space(ttcx,(ttcy + 1),0,0);
			relocate_character(my_number(),ttcx,(ttcy + 1));
			set_character_facing(my_number(),0);
			force_view_center(ttcx,ttcy);
			force_instant_terrain_redraw();
			run_animation_sound(10);
		}
		if((beta_ok == 3) && ((rctx != (ttcx - 1)) || (rcty != ttcy))){
			put_boom_on_space(rctx,rcty,0,0);
			put_boom_on_space((ttcx - 1),ttcy,0,0);
			relocate_character(my_number(),(ttcx - 1),ttcy);
			set_character_facing(my_number(),6);
			force_view_center(ttcx,ttcy);
			force_instant_terrain_redraw();
			run_animation_sound(10);
		}
		if((beta_ok == 4) && ((rctx != (ttcx + 1)) || (rcty != ttcy))){
			put_boom_on_space(rctx,rcty,0,0);
			put_boom_on_space((ttcx + 1),ttcy,0,0);
			relocate_character(my_number(),(ttcx + 1),ttcy);
			set_character_facing(my_number(),2);
			force_view_center(ttcx,ttcy);
			force_instant_terrain_redraw();
			run_animation_sound(10);
		}

		set_character_pose(my_number(),1);
		put_effect_on_space(ttcx,ttcy,12,1,2);
		force_instant_terrain_redraw();
		run_animation_sound(71);
		damage_char(trgt,get_ran(1,0,50),0);
		pause(3);

		set_character_pose(my_number(),0);
		force_instant_terrain_redraw();
		pause(3);

		avatar = (avatar - 1);
	}

	set_incidental_sound(1);
	set_terrain(17,9,0);
	set_terrain(17,10,0);
	set_terrain(17,11,0);
	set_terrain(17,12,0);
	set_terrain(17,13,0);
	set_terrain(47,9,199);
	set_terrain(47,10,0);
	set_terrain(47,11,0);
	set_terrain(47,12,0);
	set_terrain(47,13,199);
	set_terrain(24,7,0);
	set_terrain(32,7,0);
	set_terrain(40,7,0);
	set_terrain(24,15,0);
	set_terrain(32,15,0);
	set_terrain(40,15,0);
	put_boom_on_space(24,7,2,0);
	put_boom_on_space(32,7,2,0);
	put_boom_on_space(40,7,2,0);
	put_boom_on_space(24,15,2,0);
	put_boom_on_space(32,15,2,0);
	put_boom_on_space(40,15,2,0);
	force_instant_terrain_redraw();
	run_animation_sound(10);
	pause(5);

	set_total_visibility(1);
	force_view_center(27,9);
	force_instant_terrain_redraw();

	activate_hidden_group(3);
	put_boom_on_space(24,7,2,0);
	force_instant_terrain_redraw();
	run_animation_sound(10);
	pause(5);

	reset_dialog();
	add_dialog_str(0,"The portals are closed!  And Dr. Wu has appeared.",0);
	add_dialog_str(1,"_Profanus Pyre!  You have crossed the line.  Soldiers are dying due to your recklessness._",0);
	add_dialog_str(2,"_Your grudge match ends here.  It's painfully apparent that you are not sufficient for this task.  Fall back immediately._",0);
	add_dialog_choice(0,"Where's Rothgard, already?!");
	bmessage = run_dialog(1);

	force_view_center(ttcx,ttcy);
	set_total_visibility(0);
	force_instant_terrain_redraw();
	pause(5);

	reset_dialog();
	add_dialog_str(0,"_What?  But...  I wasn't trying to..._",0);
	add_dialog_str(1,"_You...  you haven't heard the last of me!  I will have revenge for this insult!_",0);
	add_dialog_choice(0,"Yeah, right.  You're nothing but hot air.");
	bmessage = run_dialog(1);

	put_item_on_spot(char_loc_x(my_number()),char_loc_y(my_number()), 476);
	put_boom_on_space(char_loc_x(my_number()),char_loc_y(my_number()), 2,0);
	erase_char(my_number());
	force_instant_terrain_redraw();
	run_animation_sound(10);

	set_total_visibility(1);
	force_view_center(27,9);
	force_instant_terrain_redraw();
	pause(6);

	reset_dialog();
	add_dialog_str(0,"_I will be waiting for you upstairs in the meeting room.  I would like to speak to you briefly before your battle with The Immortal, now that I have a chance._",0);
	add_dialog_choice(0,"Okay.");
	bmessage = run_dialog(1);

	erase_char(52);
	put_boom_on_space(24,7,2,0);
	force_instant_terrain_redraw();
	run_animation_sound(10);
	pause(3);

	set_total_visibility(0);
	force_instant_terrain_redraw();
	pause(3);

	award_party_xp(500,25);
	award_party_xp(500,25);
	award_party_xp(500,25);
	award_party_xp(500,25);

	set_flag(15,1,12);
	set_flag(20,1,1);

break;

beginstate START_STATE; 

	if(tick_difference(last_abil_time,get_current_tick()) >= 1){
		mctx = char_loc_x(my_number());
		mcty = char_loc_y(my_number());
		which_atk = get_ran(1,0,2);

		// BURNING AVATAR
		if(which_atk == 0){
			trgt = get_ran(1,41,51);
			count = 0;
			while((count <= 10) && (which_atk < 3)){
				if((char_ok(trgt) == TRUE) && ((char_attitude_to_char(my_number(),trgt) == 0) && (((creature_type(trgt) == 6) || (creature_type(trgt) == 132)) || (creature_type(trgt) == 184))))
					which_atk = 3;

				if(which_atk < 3){
					count = (count + 1);
					trgt = (trgt + 1);
					if(trgt > 51)
						trgt = 41;
				}
			}

			if(which_atk < 3)
				trgt = get_ran(1,86,119);
			count = 0;
			while((count <= 33) && (which_atk < 3)){
				if((char_ok(trgt) == TRUE) && ((char_attitude_to_char(my_number(),trgt) == 0) && (((creature_type(trgt) == 6) || (creature_type(trgt) == 132)) || (creature_type(trgt) == 184))))
					which_atk = 3;

				if(which_atk < 3){
					count = (count + 1);
					trgt = (trgt + 1);
					if(trgt > 119)
						trgt = 86;
				}
			}

			if(which_atk == 3){
				print_str_color("Profanus Pyre casts Burning Avatar.",4);
				set_character_pose(my_number(),1);
				force_instant_terrain_redraw();
				pause(2);

				play_sound(163);
				change_char_health(my_number(),-75);
				if(get_health(my_number()) <= 0){
					print_str("Spell fails!");
					last_abil_time = get_current_tick();
					end();
				}

				rctx = char_loc_x(trgt);
				rcty = char_loc_y(trgt);
				firedmg = (get_max_health(trgt) - get_health(trgt));
				fallout = creature_type(trgt);
				erase_char(trgt);
				if(fallout == 6)
					place_monster(rctx,rcty,113,0);
				if(fallout == 132)
					place_monster(rctx,rcty,114,0);
				if(fallout == 184)
					place_monster(rctx,rcty,115,0);
				avatar = 0;
				trgt = 86;
				while((trgt <= 119) && (avatar == 0)){
					if((get_stat(trgt,27) == 0) && (((creature_type(trgt) == 113) || (creature_type(trgt) == 114)) || (creature_type(trgt) == 115)))
						avatar = trgt;

					trgt = (trgt + 1);
				}
				change_char_health(avatar,(firedmg * -1));
				alter_stat(avatar,27,1);
				relocate_character(avatar,rctx,rcty);
				rctx = char_loc_x(avatar);
				rcty = char_loc_y(avatar);
				put_boom_on_space(rctx,rcty, get_ran(1,0,1),5);
				put_boom_on_space(rctx,rcty, get_ran(1,0,1),5);
				put_boom_on_space(rctx,rcty, get_ran(1,0,1),5);
				force_instant_terrain_redraw();
				run_animation_sound(5);
				pause(3);
			}
			else{
				which_atk = get_ran(1,1,2);
			}
		}

		// RALLY
		if(which_atk == 1){
			print_str_color("Profanus Pyre casts Rally.",1);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(25);
			change_char_health(my_number(),-125);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}

			trgt = 0;
			while(trgt <= 119){
				if((char_ok(trgt) == TRUE) && ((char_attitude_to_char(my_number(),trgt) == 0) && (trgt != my_number()))){
					rctx = char_loc_x(trgt);
					rcty = char_loc_y(trgt);
					put_sparkles_on_space(rctx,rcty,7, 4);
					firedmg = (get_max_health(trgt) / 4);
					firedmg = (firedmg * -1);
					change_char_health(trgt,firedmg);
					set_char_status(trgt,1, get_ran(1,0,6),0,0);
				}

				trgt = (trgt + 1);
			}
			run_animation_sound(51);
		}

		// METEOR STRIKE
		if(which_atk == 2){
			print_str_color("Profanus Pyre casts Meteor Strike.",1);
			set_character_pose(my_number(),1);
			force_instant_terrain_redraw();
			pause(2);

			play_sound(25);
			change_char_health(my_number(),-200);
			if(get_health(my_number()) <= 0){
				print_str("Spell fails!");
				last_abil_time = get_current_tick();
				end();
			}

			if(get_ran(1,0,3) != 3){
				count = 0;
				trgt = get_ran(1,0,3);
				while((count <= 3) && (which_atk < 3)){
					if(char_ok(trgt) == TRUE){
						if(get_health(trgt) < 75){
							which_atk = 3;
						}
					}

					if(which_atk < 3){
						count = (count + 1);
						trgt = (trgt + 1);
						if(trgt > 3)
							trgt = 0;
					}
				}
			}

			if(which_atk < 3){
				trgt = get_ran(1,0,119);
				count = 0;
			}
			while((count <= 119) && (which_atk < 3)){
				if(((char_ok(trgt) == TRUE) && (char_attitude_to_char(my_number(),trgt) == 2)) && (((char_loc_x(trgt) <= 46) && (char_loc_x(trgt) >= 18)) && (char_loc_y(trgt) <= 19))){
					which_atk = 3;
				}
				if(which_atk < 3){
					count = (count + 1);
					trgt = (trgt + 1);
					if(trgt >= 120)
						trgt = 0;
				}
			}
			if(which_atk < 3){
				last_abil_time = get_current_tick();
				end();
			}

			rctx = char_loc_x(trgt);
			rcty = char_loc_y(trgt);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_boom_on_space(rctx,rcty,1,8);
			put_effect_on_space(rctx,rcty,1,4,2);
			put_boom_on_space((rctx + 1),rcty,1,8);
			put_boom_on_space((rctx + 1),rcty,1,8);
			put_effect_on_space((rctx + 1),rcty,1,3,2);
			put_boom_on_space((rctx - 1),rcty,1,8);
			put_boom_on_space((rctx - 1),rcty,1,8);
			put_effect_on_space((rctx - 1),rcty,1,3,2);
			put_boom_on_space(rctx,(rcty + 1),1,8);
			put_boom_on_space(rctx,(rcty + 1),1,8);
			put_effect_on_space(rctx,(rcty + 1),1,3,2);
			put_boom_on_space(rctx,(rcty - 1),1,8);
			put_boom_on_space(rctx,(rcty - 1),1,8);
			put_effect_on_space(rctx,(rcty - 1),1,3,2);
			put_boom_on_space((rctx + 1),(rcty + 1),1,8);
			put_effect_on_space((rctx + 1),(rcty + 1),1,2,2);
			put_boom_on_space((rctx + 1),(rcty - 1),1,8);
			put_effect_on_space((rctx + 1),(rcty - 1),1,2,2);
			put_boom_on_space((rctx - 1),(rcty + 1),1,8);
			put_effect_on_space((rctx - 1),(rcty + 1),1,2,2);
			put_boom_on_space((rctx - 1),(rcty - 1),1,8);
			put_effect_on_space((rctx - 1),(rcty - 1),1,2,2);
			put_effect_on_space((rctx + 2),(rcty + 2),1,1,2);
			put_effect_on_space((rctx + 2),(rcty + 1),1,1,2);
			put_effect_on_space((rctx + 2),rcty,1,1,2);
			put_effect_on_space((rctx + 2),(rcty - 1),1,1,2);
			put_effect_on_space((rctx + 2),(rcty - 2),1,1,2);
			put_effect_on_space((rctx - 2),(rcty + 2),1,1,2);
			put_effect_on_space((rctx - 2),(rcty + 1),1,1,2);
			put_effect_on_space((rctx - 2),rcty,1,1,2);
			put_effect_on_space((rctx - 2),(rcty - 1),1,1,2);
			put_effect_on_space((rctx - 2),(rcty - 2),1,1,2);
			put_effect_on_space((rctx - 1),(rcty + 2),1,1,2);
			put_effect_on_space((rctx - 1),(rcty - 2),1,1,2);
			put_effect_on_space(rctx,(rcty + 2),1,1,2);
			put_effect_on_space(rctx,(rcty - 2),1,1,2);
			put_effect_on_space((rctx + 1),(rcty + 2),1,1,2);
			put_effect_on_space((rctx + 1),(rcty - 2),1,1,2);
			run_animation_sound(169);
			fallout = 0;
			while(fallout <= 119){
				if(char_ok(fallout) == TRUE){
					if(char_dist_to_loc(fallout,rctx, rcty) <= 3){
						firedmg = get_char_status(trgt,2);
						if(firedmg > 0)
set_char_status(trgt,2,(firedmg * -1),0,0);
						firedmg = get_char_status(trgt,4);
						if(firedmg > 0)
set_char_status(trgt,4,(firedmg * -1),1,0);
						firedmg = get_char_status(trgt,5);
						if(firedmg > 0)
set_char_status(trgt,5,(firedmg * -1),1,0);
						firedmg = get_char_status(trgt,15);
						if(firedmg > 0)
set_char_status(trgt,15,(firedmg * -1),1,0);
						firedmg = get_char_status(trgt,16);
						if(firedmg > 0)
set_char_status(trgt,16,(firedmg * -1),1,0);
						firedmg = get_char_status(trgt,17);
						if(firedmg > 0)
set_char_status(trgt,17,(firedmg * -1),1,0);
						firedmg = get_char_status(trgt,29);
						if(firedmg > 0)
set_char_status(trgt,29,(firedmg * -1),1,0);
					}
				}

				fallout = (fallout + 1);
			}
			damage_near_loc(rctx,rcty,get_ran(1,50,100),3,1);
			status_near_loc(rctx,rcty,get_ran(1,0,2),1,11);
			pause(2);
		}

		set_character_pose(my_number(),0);
		force_instant_terrain_redraw();
		pause(2);
		last_abil_time = get_current_tick();
	}

break;

beginstate TALKING_STATE;
	if (get_memory_cell(3) == 0) {
		print_str("Talking: It doesn't respond.");
		end();
		}
	begin_talk_mode(get_memory_cell(3));
break;